home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 5
/
Aminet 5 - March 1995.iso
/
Aminet
/
misc
/
amag
/
AM9410_2.lha
/
Haufenweise
/
Programme
/
AllocSupport.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-07-15
|
3KB
|
108 lines
/*
* Support-Routinen für Allocate/Deallocate
*
* Version: $VER: AllocSupport.c 1.0 © D. Göhler (11.07.94)
*/
#include "AllocSupport.h"
/*
* AllocMemHeader alloziert einen neuen Block Speicher von
* der globalen Speicherliste des Betriebs-
* systems. Vom neuen Block können dann mit
* AllocateVec() und DeallocateVec() Blöcke
* alloziert und wieder zurückgegeben werden.
*/
struct MemHeader *AllocMemHeader(ULONG Size, ULONG Flags)
{
APTR block;
struct MemHeader *mh = 0L;
struct MemChunk *mc;
/* Speicher für alles besorgen */
if (block = AllocMem(Size+sizeof(*mh),Flags))
{
/* MemHeader in den Speicherblock legen */
mh = (struct MemHeader *)block;
/* block zeigt hiernach auf den eigentlichen Anfang */
/* des freien Speicherbereichs mit der Größe Size */
block = (UBYTE *)block + sizeof(*mh);
/* mc beschreibt das einzige freie Stück im Block */
mc = (struct MemChunk *) block;
/* jetzt wird die Speicher-Struktur initialisiert */
mh->mh_Node.ln_Type = NT_MEMORY;
mh->mh_Node.ln_Name = 0;
mh->mh_Node.ln_Succ = NULL;
mh->mh_Node.ln_Pred = NULL;
mh->mh_First = (struct MemChunk *)block;
mh->mh_Lower = block;
mh->mh_Upper = (UBYTE *)block + Size;
mh->mh_Free = Size; // - sizeof(*mc);
/* Der Bereich enthält zu Beginn nur 1 Stück, und
das ist genau Size Byte groß */
mc->mc_Next = NULL;
mc->mc_Bytes = mh->mh_Free;
}
return mh;
}
/*
* FreeMemHeader gibt den Speicher wieder frei, der mit
* AllocMemheader alloziert wurde.
*/
void FreeMemHeader(struct MemHeader *mh)
{
FreeMem(mh,((UBYTE *)mh->mh_Upper - (UBYTE *)mh->mh_Lower)
+ sizeof(*mh));
}
/*
* AllocateVec arbeitet wie Allocate, mit dem Unterschied,
* daß es selbst speichert, wir groß der Block
* war. Damit muß man beim Freigeben des Blocks
* die Länge nicht angeben.
*
* WICHTIG: Zum Freigeben immer DeallocateVec() benutzen,
* nie Deallocate(), da sonst Speicher verloren
* geht.
*/
void *AllocateVec(struct MemHeader *mh, ULONG len)
{
APTR mem = 0L;
ULONG memlen = len + sizeof(ULONG);
if ((len + 4) <= mh->mh_Free)
{ if (mem = Allocate(mh,memlen))
{ *(ULONG *)mem = memlen;
mem = (ULONG *)mem + 1;
}
}
return mem;
}
/*
* DeallocateVec ist das Gegenstück zu AllocateVec(). Es
* liest die Länge aus der Langwort-Adresse
* vor dem freizugebenden Speicherblock und
* gibt den Block frei.
*
* WICHTIG: Bitte diese Funktion nur mit AllocateVec()
* benutzen, nie mit Allocate()!
*/
void DeallocateVec(struct MemHeader *mh, APTR mem)
{
mem = ((ULONG *)mem - 1);
Deallocate(mh, mem, *(ULONG *)mem);
}